#ifndef __CONSTANTES_H__
#define __CONSTANTES_H__

/** Constantes relacionadas a argumentos del programa **/
#define CANTIDAD_ARGUMENTOS_NECESARIOS    2
#define POSICION_ARGUMENTO_NOMBRE_ARCHIVO 1

/** Maxima longitud linea archivo **/
#define MAX_LONGITUD_LINEA 256

/** Maxima longitud de un dato **/
#define MAX_DATO 256

/** Maxima cantidad tokens **/
#define MAX_TOKEN 256

/** Maxima longitud mensaje error **/
#define MAX_LONGITUD_MENSAJE_ERROR 256

/** Cantidad de claves validas predefinidas para un tweet**/
#define CANT_CLAVES 9

/** los eventos posibles**/
typedef enum{
    CB_COMIENZA_ARRAY,
    CB_TERMINA_ARRAY,
    CB_COMIENZA_OBJETO,
    CB_TERMINA_OBJETO,
    CB_CLAVE,
    CB_TRUE,
    CB_FALSE,
    CB_NULL,
    CB_NUMERO,
    CB_STRING
}TipoEvento;

/** Codigo de ejecucion OK **/
#define CODIGO_OK 0

/** Caracter vacio */
#define CARACTER_VACIO ' '

/** String vacio **/
#define STRING_VACIA ""

/** String espacio **/
#define STRING_ESPACIO " "

/** Caracter fin de cadena **/
#define CARACTER_FIN_CADENA '\0'

/** Caracter fin de linea **/
#define CARACTER_FIN_LINEA '\n'

/** String fin de linea **/
#define STRING_FIN_LINEA "\n"

/** Se usa para corregir el codigo de error para obtener el mensaje
    desde la funcion auxiliar **/
#define CORRECCION_CANTIDAD_ERRORES 6

/** Codigos de errores **/
#define CODIGO_ERROR_CANTIDAD_ARGUMENTOS_INVALIDA 1
#define CODIGO_ERROR_ARCHIVO_INEXISTENTE          2
#define CODIGO_ERROR_TOKEN_INVALIDO               3
#define CODIGO_ERROR_VALOR_ARRAY_INVALIDO         4

/** Mensaje errores correspondientes a cada codigo **/
#define MENSAJE_CANTIDAD_ARGUMENTOS_INVALIDA "La cantidad de argumentos con la que se invoco al programa es invalida"
#define MENSAJE_ARCHIVO_INEXISTENTE          "El archivo que se trato de procesar no existe"

/** Valores de indicador de si se esta procesando un array en el sintactico **/
#define NO_PROCESANDO_ARRAY 30
#define PROCESANDO_ARRAY    31
#define TIPO_ARRAY_STRING   32
#define TIPO_ARRAY_NUMERO   33
#define TIPO_ARRAY_VACIO    34

/** Constantes de orden, usadas en los comparadores **/
#define MENOR -1
#define IGUAL 0
#define MAYOR 1

/** Constantes concatenacion de claves **/
#define CONCATENADOR_CLAVES_STRING   "|"
#define CONCATENADOR_CLAVES_CARACTER '|'
#define FIN_CADENA '\0'
#define STRING_FIN_CADENA '\0'

/** Constante de identificacion de sub objeto **/
#define IDENTIFICADOR_SUBOBJETO "user"

/** Separador de terminos de las frases **/
#define SEPARADOR_TERMINOS " "

/** Codigo de errores del Tokenizer */
#define CODIGO_ERROR_NO_PROCESAR_TERMINO 40

/** Nombre del archivo con los terminos a omitir */
#define NOMBRE_ARCHIVO_TERMINOS_OMITIR "data/terminosOmitir.txt"

/** Constantes de la consola **/
#define MAX_COMANDO 255
#define SEPARADOR_ARGUMENTOS " "
#define MAX_CANTIDAD_ARGUMENTOS 10

/** Comandos de la consola **/
#define ID_COMANDO_INVALIDO   -1
#define ID_COMANDO_AGREGAR    1
#define ID_COMANDO_AND        2
#define ID_COMANDO_OR         3
#define ID_COMANDO_ELIMINAR_U 4
#define ID_COMANDO_ELIMINAR_T 5
#define ID_COMANDO_OPTIMIZAR  6
#define ID_COMANDO_SALIR      7
#define CODIGO_ERROR_ARGUMENTOS_INVALIDOS 8
#define COMANDO_AGREGAR       "agregar"
#define COMANDO_AND           "and:"
#define COMANDO_OR            "or:"
#define COMANDO_ELIMINAR_U    "eliminarU:"
#define COMANDO_ELIMINAR_T    "eliminarT:"
#define COMANDO_OPTIMIZAR     "optimizar"
#define COMANDO_SALIR         "salir"
#define TEXTO_PROMPT          "COMANDO> "

/** Claves de los diccionarios **/
#define CLAVE_NUMERO_TWEET  "id_str"
#define CLAVE_USUARIO_TWEET "user|screen_name"
#define CLAVE_FECHA_TWEET   "created_at"

/** Se usa en el comparador de igualdad de diccionarios **/
#define DISTINTO -2

#endif
